﻿#pragma execution_character_set("utf-8")
#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    server = new QTcpServer(this);
    connectD2B();
    bool result = server->listen(QHostAddress::Any,9966);
    if(!result)
    {
        ui->textBrowser->append("监听失败！");
        return;
    }
    ui->textBrowser->append("监听成功！端口号9966");
    connect(server,SIGNAL(newConnection()),
            this,SLOT(newConnectionSlot()));
}

Dialog::~Dialog()
{
    delete ui;
}
void Dialog::createTable()
{
    // sql语句
    QString sql = "CREATE TABLE account(accout INTEGER PRIMARY KEY,password TEXT);";

    // 创建数据库操作类
    QSqlQuery sq;

    if(sq.exec(sql))    // 表创建成功
    {
        qDebug() << "建表1成功";
    }
    else    // 建表失败，注意：建表成功或者失败都很正常，如果要建立的表已经存在，就会建表失败
    {
        QSqlError errInfo = sq.lastError();
        QString text = errInfo.text();
        qDebug() << "建表1失败:" << text;
    }
    sql = "CREATE TABLE information(nickname TEXT,time TEXT,infor TEXT);";


    if(sq.exec(sql))    // 表创建成功
    {
        qDebug() << "建表2成功";
    }
    else    // 建表失败，注意：建表成功或者失败都很正常，如果要建立的表已经存在，就会建表失败
    {
        QSqlError errInfo = sq.lastError();
        QString text = errInfo.text();
        qDebug() << "建表2失败:" << text;
    }
    sql = "CREATE TABLE userTouser(nickname1 TEXT,nickname2 TEXT,time TEXT,infor TEXT);";


    if(sq.exec(sql))    // 表创建成功
    {
        qDebug() << "建表3成功";
    }
    else    // 建表失败，注意：建表成功或者失败都很正常，如果要建立的表已经存在，就会建表失败
    {
        QSqlError errInfo = sq.lastError();
        QString text = errInfo.text();
        qDebug() << "建表3失败:" << text;
    }
}

void Dialog::connectD2B()
{
    // 获取数据库的连接对象
    db = QSqlDatabase::addDatabase("QSQLITE");
    // 设置数据库名称
    db.setDatabaseName("QQ.db");
    // 打开数据库连接
    bool ret = db.open();
    if(ret == true)
    {
        qDebug () << "打开成功";
        createTable();
    }
    else
    {
        // 数据库连接打开失败
        QSqlError errInfo = db.lastError();
        QString text = errInfo.text();
        QMessageBox::critical(this,"错误",text);
    }
}


void Dialog::newConnectionSlot()
{
    if(lis.size()>20)
    {
        //给服务器发送关闭窗口请求
    }
    socket=server->nextPendingConnection();



    connect(socket,SIGNAL(disconnected()),
            this,SLOT(disConnectionSlot()));
    connect(socket,SIGNAL(readyRead()),
            this,SLOT(readyReadSlot()));

    // 获取对面的IP地址
    QString ip = socket->peerAddress().toString();
    // 获取对面的端口号
    quint16 port = socket->peerPort();

    ip.prepend("新连接来了！").append(":").append(QString::number(port));
    ui->textBrowser->append(ip);
    if(count==0)
    {
        //把新的socket存入链表
        lis<<socket;
        count=1;


    }else if(count==1)
    {
        lis.removeLast();
        lis<<socket;
        QString text=QString::number(port);
        text.append("/").append(QString::number(lis.size()));

        text.append("/请选择");

        for(int i=0;i<lis.size();i++)
        {
            text.append("/").append(QString::number(lis.at(i)->peerPort()));
        }
        text.append("/");
        QByteArray buffer=text.toUtf8();
        for(int i=0;i<lis.size();i++)
        {
            lis.at(i)->write(buffer);
        }
        count=0;

    }

}

void Dialog::disConnectionSlot()
{
    socket=(QTcpSocket*)sender();
    for(int i=0;i<lis.size();i++)
    {
        if(lis.at(i)==socket)
        {
            lis.removeAt(i);
            QString ip = socket->peerAddress().toString();
            // 获取对面的端口号
            quint16 port = socket->peerPort();

            ip.prepend("老连接断了！").append(":").append(QString::number(port));

            ui->textBrowser->append(ip);
        }
    }


    QString text="0";
    text.append("/").append(QString::number(lis.size()));
    QByteArray buffer = text.toUtf8();
    // 所有socket都发送
    for(int i=0;i<lis.size();i++)
    {
        lis.at(i)->write(buffer);
    }

}

void Dialog::readyReadSlot()
{
    socket=(QTcpSocket*)sender();
    QByteArray buffer = socket->readAll();
    // QByteArray → QString
    QString text(buffer);
    if(text=="*")
    {
        QString sql = "SELECT * FROM information";
        QSqlQuery sq;

        if(sq.exec(sql))
        {
            QString te=":";
            //nickname TEXT,time TEXT,infor TEXT
            while(sq.next())    // 循环取出
            {
                QString nickname = sq.value(0).toString();
                QString time = sq.value(1).toString();
                QString infor = sq.value(2).toString();

                te.append("\n").append(nickname).append("-").append(time).append("\n").append(infor);

            }
            QByteArray buffer = te.toUtf8();

            socket->write(buffer);
        }
        else
        {

        }


        return ;
    }



    QStringList list=text.split("/");
    if(list.size()==1)
    {
        for(int i=0;i<lis.size();i++)
        {
            if(text==QString::number(lis.at(i)->peerPort()))
            {
                qDebug()<<"123";
                QString sql = "SELECT *FROM userTouser WHERE nickname1=";
                sql.append(text);


                QSqlQuery sq;

                if(sq.exec(sql))
                {
                    QString te=":";

                    while(sq.next())    // 循环取出
                    {
                        QString nickname1 = sq.value(0).toString();
                        QString nickname2 = sq.value(1).toString();
                        QString time = sq.value(2).toString();
                        QString infor = sq.value(3).toString();

                        te.append("\n").append(nickname1).append(" to ").append(nickname2).append("---").append(time).append("\n").append(infor);

                    }

                    QByteArray buffer = te.toUtf8();

                    socket->write(buffer);
                }
                else
                {

                }
                return ;
            }
        }

        if(list.at(0)=="请选择")
        {
            return ;
        }

        QDateTime dt = QDateTime::currentDateTime();
        QString time=dt.toString("yyyy年MM月dd日hh时mm分");
        QString sql = "INSERT INTO information VALUES(?,?,?)";
        // 预处理
        QSqlQuery sq;
        sq.prepare(sql);

        QString text=QString::number(socket->peerPort());
        sq.addBindValue(text);
        sq.addBindValue(time);
        sq.addBindValue(list.at(0));
        //存入数据库
        if(sq.exec())
        {
            ui->textBrowser->append("插入成功");
        }
        else // 失败
        {
            // 获取错误信息封装类
            QSqlError info = sq.lastError();
            QString text = info.text();
            QMessageBox::warning(this,"通知","数据插入失败");

        }

        //发送给各个用户
        text.append("/").append(time).append("/").append(list.at(0));
        QByteArray buffer = text.toUtf8();
        // 所有socket都发送
        for(int i=0;i<lis.size();i++)
        {
            lis.at(i)->write(buffer);
        }

    }

    else if(list.size()==3)
    {

        if(list.at(2)=="0")
        {



            QString sql = "INSERT INTO account VALUES(?,?)";
            // 预处理
            QSqlQuery sq;
            sq.prepare(sql);
            sq.addBindValue(list.at(0));
            sq.addBindValue(list.at(1));
            if(sq.exec())
            {
                ui->textBrowser->setText("插入成功");
            }
            else // 失败
            {
                // 获取错误信息封装类
                QSqlError info = sq.lastError();
                QString text = info.text();
                QMessageBox::warning(this,"通知","数据插入失败");
                qDebug() << text;
            }
        }else if(list.at(2)=="1")
        {

            QString sql = "SELECT * FROM account";
            QSqlQuery sq;

            if(sq.exec(sql))
            {
                while(sq.next())    // 循环取出
                {
                    QString a = sq.value(0).toString();
                    QString b = sq.value(1).toString();
                    QString c=list.at(0);
                    QString d=list.at(1);

                    if((!QString::compare(a,c))&&(!QString::compare(b,d)))
                    {

                        //确认密码
                        QString text="1";
                        QByteArray buffer = text.toUtf8();
                        // 发送
                        socket->write(buffer);
                        text="共有";


                        text.append(QString::number(lis.size())).append("人");
                        ui->textBrowser->append(text);
                        return ;
                    }

                }
                QString text="0";
                QByteArray buffer = text.toUtf8();
                // 发送
                socket->write(buffer);

            }

        }


    }
    else if(list.size()==2)
    {

        QDateTime dt = QDateTime::currentDateTime();
        QString time=dt.toString("yyyy年MM月dd日hh时mm分");
        QString sql = "INSERT INTO userTouser VALUES(?,?,?,?)";
        // 预处理
        QSqlQuery sq;
        sq.prepare(sql);
        sq.addBindValue(QString::number(socket->peerPort()));
        sq.addBindValue(list.at(0));
        sq.addBindValue(time);
        sq.addBindValue(list.at(1));
        if(sq.exec())
        {
            ui->textBrowser->setText("插入成功");
        }
        else // 失败
        {
            // 获取错误信息封装类
            QSqlError info = sq.lastError();
            QString text = info.text();
            QMessageBox::warning(this,"通知","数据插入失败");
            qDebug() << text;
        }
        QString text=QString::number(socket->peerPort());
        //拼接成 用户1/用户2/时间/text
        text.append("/").append(list.at(0)).append("/").append(time).append("/").append(list.at(1));
        QByteArray buffer = text.toUtf8();
        // 发送
        for(int i=0;i<lis.size();i++)
        {
            if(QString::number(lis.at(i)->peerPort())==list.at(0))
            {

                lis.at(i)->write(buffer);
                socket->write(buffer);
                return;
            }
        }

    }



}
